﻿// 指针.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
void 数组删除();
void 结构体数指针();
void 指针访问数组();
void 指针占用空间();
void 常量指针();
int main()
{
	 数组删除();
	结构体数指针();
	指针访问数组();
	指针占用空间();
	 常量指针();
	//1、指针的定义
	int a = 10;//定义整型变量a
	//指针定义语法:
	//数据类型* 变量名
		int* p;
	//指针变量赋值
	p = &a;//指针指向变量a的地址
	cout <<&a << endl;//打印数据a的地址
	cout << p << endl; //打印指针变量p
	//2、指针的使用
	//通过*操作指针变量指向的内存
	cout << "*p ="<< *p << endl;
	system("pause");
	return 0;
}


void  数组删除()
{
	int arr[5] = { 0,1,2,3,4 };
	int length = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < length; i++) 
	{
		arr[i] = arr[i + 1];
		cout << arr[i];
	}
	system("pause");

}
struct MyStruct
{

	string   Name;
	int age;
	int score;


};
///
void Print(const MyStruct *my)//使用指针  只引用地址4字节，而不是整个对象
{
	//my->age = 99;//const 防止修改
	cout << "姓名" << my->Name << "年龄" << my->age << "分数" << my->score << endl;
}
void   结构体数指针() 
{
	struct MyStruct s=
	{
		"张三",
		15,
		70

	};
	Print(&s);
	cout << "姓名" << s.Name << "年龄" << s.age << "分数" << s.score << endl;
	system("pause");
}





/*
* 指针在方法中传参
* 
方法通过指针 传参数改变值 会影响方法外值显示，普通传参数改变值不会影响方法外值的显示
值传递退回改变实际参数值，地址传参会改变

*/




void 指针参数()
{
	int arr[5] = { 0,1,2,3,4 };

	int* p = arr;

	cout << "第一个元素" << *p;

	int val = sizeof(arr);
	int val2 = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		cout << "\n便利元素" << *p << endl;
		p++;
	}
	system("pause");

}
void 指针访问数组() 
{
	int arr[5] = { 0,1,2,3,4 };
	
	int* p = arr;

	cout << "第一个元素" << *p;

	int val = sizeof(arr);
	int val2 = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		cout << "\n便利元素" << * p <<endl;
		p++;
	}
	system("pause");

}
void 指针占用空间()
{
	//指针所占内存空间
	int a = 10;
	//int * p;
	//p = &a;
	int* p = &a;
	//指针是占4个字节空间大小，不管是什么数据类型
		//在32位操作系统下，
		
	//	在64位操作系统下，
		//指针是占8个字节空间大小
	cout <<"sizeof(int *)="<<sizeof(int *) << endl; 
	cout << "sizeof(int *)=" << sizeof(float*) << endl;
	cout << "sizeof(int *)=" << sizeof(double*) << endl;
	cout << "sizeof(int *)=" << sizeof(char*) << endl;

}


void 常量指针() 
{
	//1 const 修饰指针，常量指针
	int a = 10;
	int b = 10;
		const int* p = &a;
	//指针指向的值不可以改，指针的指向可以改
	//*p = 20;错误
	p = &b;//正确
	//指针常量
  //2、const修饰常量
		//指针的指向不可以改，指针指向的值可以改
		int* const p2 = &a;
	*p2 = 100;//正确的
	//p2 = &b; //错误，指针的指向不可以改
	//3、const修饰指针和常量
	const int* const p3 = &a;
	//指针的指向 和指针指向的值 都不可以改
	//*p3 = 100;// 错误
     //p3 = &b;
	//错误
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
